import axios from 'axios'
import { ElMessage } from 'element-plus'
import { useUserStore } from '@/stores/user'

// 创建axios实例
const request = axios.create({
  baseURL: '/api',
  timeout: 10000
})

// 请求拦截器
request.interceptors.request.use(
  (config) => {
    // 检查是否需要跳过认证
    const noAuth = (config as any).noAuth || config.headers['X-No-Auth'] === 'true'
    
    if (!noAuth) {
      const userStore = useUserStore()
      
      // 添加token到请求头
      if (userStore.token) {
        config.headers.Authorization = `Bearer ${userStore.token}`
      }
    }
    
    console.log('发送请求:', config)
    return config
  },
  (error) => {
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

// 刷新token的辅助函数
async function handleTokenRefresh(error: any) {
  // 添加标记，防止多个请求同时触发刷新
  if (error.config._retry) {
    return Promise.reject(error)
  }
  
  error.config._retry = true
  try {
    const userStore = useUserStore()
    const refreshToken = localStorage.getItem('refreshToken')
    
    // 如果有refresh_token，尝试刷新
    if (refreshToken) {
      console.log('检测到401错误，尝试刷新token...')
      
      // 刷新token
      const newToken = await userStore.refreshToken()
      
      // 重试原始请求
      console.log('Token刷新成功，重试原始请求...')
      const originalRequest = error.config
      originalRequest.headers.Authorization = `Bearer ${newToken}`
      
      // 使用新的token重试请求
      return request(originalRequest)
    } else {
      // 没有refresh_token，直接登出
      throw new Error('没有可用的刷新token')
    }
  } catch (refreshError) {
    console.error('Token刷新失败:', refreshError)
    
    // 只有在当前页面不是登录页时才显示错误信息并跳转
    if (!window.location.pathname.includes('/login') && !window.location.pathname.includes('/phone-login')) {
      setTimeout(() => {
        // 再次检查是否有有效token，避免重复跳转
        const currentToken = localStorage.getItem('token')
        if (!currentToken && !window.location.pathname.includes('/login')) {
          ElMessage.error('登录已过期，请重新登录')
          const userStore = useUserStore()
          userStore.logout()
          window.location.href = '/login'
        }
      }, 1000)
    }
    
    // 如果当前已经是登录页面，则不进行跳转
    throw refreshError
  }
}

// 响应拦截器
request.interceptors.response.use(
  (response) => {
    const { data } = response
    
    // 如果返回的是二进制数据（如文件下载），直接返回
    if (response.config.responseType === 'blob') {
      return response
    }
    
    // 处理成功响应
    console.log('响应数据:', data)
    return data
  },
  (error) => {
    console.error('响应错误:', error)
    const { response } = error
    
    if (response) {
      const { status, data } = response
      
      switch (status) {
        case 400:
          ElMessage.error(data.message || '请求参数错误')
          break
        case 401:
          // 处理token刷新
          return handleTokenRefresh(error)
        case 403:
          ElMessage.error('没有权限访问该资源')
          break
        case 404:
          ElMessage.error('请求的资源不存在')
          break
        case 500:
          ElMessage.error('服务器内部错误')
          break
        default:
          ElMessage.error(data.message || '请求失败')
      }
    } else {
      ElMessage.error('网络错误，请检查网络连接')
    }
    
    return Promise.reject(error)
  }
)

export default request